package com.service;

import com.bean.Express;
import com.dao.BaseExpressDao;
import com.dao.imp.ExpressDaoMysql;
import com.exception.CodeException;
import com.exception.NumberException;
import com.util.ExpressEnum;
import com.util.IpUtil;
import com.util.RandomUtil;
import com.util.SMSUtil;

import java.util.List;
import java.util.Map;

/**
 * @Author: 柏竹
 * @Description: 快递业务处理
 * @Date_Created_in: 2021-05-22 17:45
 * @Modified_By: Sans
 * @Project: 快递e栈
 */
public class ExpressService{
    
    private static BaseExpressDao dao = new ExpressDaoMysql();
    
    /**
     * 查 库 全部快递(总数,新增)，代取件快递(总数,新增)
     *
     * @return [{size:总数,day:新增},{size:总数,day:新增}]
     */
    public static List<Map<String, Integer>> console() {
        return dao.console();
    }
    
    /**
     * 查 所有 快递信息
     *
     * @param limit      是否分页
     * @param offset     起始索引
     * @param pageNumber 每页查询数
     * @return 快递结果集
     */
    public static List<Express> findExpressAll(boolean limit , int offset , int pageNumber) {
        return dao.findExpressAll(limit,offset,pageNumber);
    }
    
    /**
     * 查 指定 快递信息
     *
     * @param type 查询类型
     * @param data 查指定信息
     * @return 快递信息
     */
    public static List<Express> findExpress(String type , String data) {
        if (data == null) {
            return null;
        }
        return dao.findExpress(type,data);
    }
    
    /**
     * 查 指定 手机号、状态 快递信息
     *
     * @param userPhone 手机号
     * @param status 状态值
     * @return 快递信息
     */
    public static List<Express> findByUserPhoneAndStatus(String userPhone , int status) {
        if (userPhone == null) {
            return null;
        }
        return dao.findByUserPhoneAndStatus(userPhone,status);
    }
    
    /**
     * 获取 地区快递数
     * @return
     */
    public static List departureAllSize(){
        return dao.departureAllSize();
    }
    
    /**
     * 录入 快递
     *
     * @param e 快递对象
     * @return 是否成功
     */
    public static boolean insert(Express e){
        e.setCode(RandomUtil.getCode()+"");
        String ip = IpUtil.getOutIPV4();
        e.setDeparture(IpUtil.findByCity(ip));
        e.setDestination("");
        e.setInuserip(ip);
        try {
            boolean insert = dao.insert(e);
            if (insert){
                SMSUtil.send(e.getUserphone(),e.getCode());
            }
            return insert;
        } catch (CodeException codeException) {
            return insert(e);
        } catch (NumberException numberException) {
            System.err.println("单号重复了！！！");
        }
        return false;
    }
    
    /**
     * 修改 快递
     *
     * @param id           快递id
     * @param newException 快递对象
     * @return 是否成功
     */
    public static boolean update(int id , Express newException) {
        List<Express>  expressList = dao.findExpress(ExpressEnum.ID.type , String.valueOf(id));
        boolean update;
        //如果修改手机号则重新插入
        if (!newException.getUserphone().equals(expressList.get(0).getUserphone())){
            dao.delete(id);
            update = insert(newException);
        }else{
            update = dao.update(id,newException);
            Express e = expressList.size() == 1?e = expressList.get(0):null;
            if (newException.getStatus() == 1 && e != null){
                updateStatus(e.getCode());
            }
        }
        return update;
    }
    
    /**
     * 修改 快递  (取件)
     *
     * @param code 取件号
     * @return 是否成功
     */
    public static boolean updateStatus(String code) {
        return dao.updateStatus(code);
    }
    
    /**
     * 删除 快递
     *
     * @param id 快递id
     * @return 是否成功
     */
    public static boolean delete(int id) {
        return dao.delete(id);
    }
    
    
    
}
